let Vue = null;
function install(_Vue){
  console.log(_Vue)
  Vue = _Vue;
  // 实现每一个组件 都能通过 this调用$store
  Vue.mixin({
    beforeCreate() {
      // 通过 this.$options 可以获取new Vue({参数}) 传递的参数
      if(this.$options.store){
        // 证明这个this是根实例 也就是 new Vue 产生的哪个实例
        this.$store = this.$options.store
      }else if(this.$parent){
        //this.$parent 有这个属性的 证明 当前组件是在 APP 组件的后代组件
        this.$store = this.$parent.$store
      }
    },
  })
}
class Store{
  constructor(options){
    // this.state = options.state这么写state不是响应式
    let vm = new Vue({
      data:{
        state:options.state
      }
    })
    this.state = vm.state;

    this.mutationsqqq = {};// 就是为了存储 传进来的mutations中的函数
    let mutations = options.mutations || {};
    Object.keys(mutations).forEach(key=>{
      this.mutationsqqq[key] = (qqq)=>{
        // this 是当前vuex实例
        mutations[key].call(this,this.state,qqq)
        // mutations[key](this.state,qqq)
        // mutations[key] ---> changeCount
      }
      // this.mutationsqqq[key] = mutations[key].bind(this,this.state)
    })

    this.actions = {};
    let actions = options.actions || {};
    Object.keys(actions).forEach(key=>{
      this.actions[key] = (qqq)=>{
        actions[key].call(this,this,qqq)
      }
    })

    this.getters = {};
    let getters = options.getters || {};
    Object.keys(getters).forEach(key=>{
      // this.getters[key
      Object.defineProperty(this.getters,key,{
        get:()=>{
          return  getters[key].call(this,this.state)
        }
      })
    })
  }
  commit(type,aaa){
    // this.$store.commit('changeCount',1111) 这个this是组件

    // this.mutations.chnageCount
    this.mutationsqqq[type](aaa) // this是vuex实例
  }
  dispatch(type,aaa){
    // this.$store.dispatch('changeCount',100)
    this.actions[type](aaa)
  }
}
//辅助函数的实现 mapState...
export function mapState(ary){
  let obj = {};
  // {count(){return this.$store.state.count}}
  ary.forEach(item=>{
    obj[item] = function(){
      // this 是组件实例
      console.log('vuex',this)
      return this.$store.state[item]
    }
  })
  return obj
}

export function mapMutations(ary){
  let obj = {}
  ary.forEach(item=>{
    obj[item] = function (params) {
      return this.$store.commit(item,params)
    }
  })
  return obj
}

export default {
  Store,
  install
}